package com.qf.fmall.user.controller;

import cn.hutool.crypto.SecureUtil;
import com.qf.fmall.user.entity.User;
import com.qf.fmall.user.service.IUserService;
import com.qf.fmall.user.vo.UserRegistRequestVo;
import com.qf.fmall.utils.TokenUtils;
import com.qf.fmall.utils.UserUtils;
import com.qf.fmall.vo.ResultVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author djl
 * @since 2024-04-24
 *
 * 什么是跨域 （CORS）
 * 指的是浏览器的一种特殊行为
 * 满足如下两个条件：
 * (1) 必须是ajax请求 。
 * (2) 满足跨域条件。
 * 什么是跨域？
 * 域的组成：三部分。 协议名字+域名或者ip地址+端口号
 * 这三个部分的任意一个不一样，都算跨域
 * http://127.0.0.1:5500  ----> http://127.0.0.1:8080 (端口号不一样)
 *
 * http://127.0.0.1:5500 ------> http://127.0.0.1:5500 (不算跨域)
 *
 * 当发生跨域问题时，浏览器会限制使用服务返回的任何数据
 *
 * 如何解决跨域问题？
 * 后端解决跨域的方案：添加必要的响应头
 * @CrossOrign
 *
 *
 */

@CrossOrigin  // 跨域注解
@RestController
@RequestMapping("/user")
@Slf4j  // 日志注解
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 返回的json中，msg是token
     * token的形式：一个特殊的字符串。
     * token的作用：如果请求方能够提供一个合法的token，就代表他曾经登录成功过
     *
     * 对于token的要求：
     * (1) 需要服务器端可以校验token的合法性
     * (2) 最好能通过token识别出来用户的身份
     *
     * @param username
     * @param password
     * @return
     */
    @GetMapping("/login")
    public ResultVo login(String username,String password){

        //1. 打印日志
        log.info("传入的参数为，username={},password=******",username);

        //2. 参数校验
        UserUtils.checkUser(new User(username,password));

        //3. 调用service层的方法进行业务逻辑处理
        User user =  userService.login(username,password);

        //4. 生成jwt
        String jwt = TokenUtils.createJWT(username, user.getUserId(), 60 * 60 * 2);

        //5. 返回json给前端
        return new ResultVo(10000,jwt,user);
    }

    private String createSign(String username) {
        return SecureUtil.md5(TokenUtils.PRIVATE_KEY+username);
    }


    @PostMapping("/regist")
    public ResultVo regist(@RequestBody UserRegistRequestVo vo) {

        //1. 打印日志.项目中打印日志的方式 在类上添加一个注解
//        log.info("接收到的参数为：uservo={}", vo);
        log.info("接收到的参数为：username={},password={},repass={}", vo.getUsername(), vo.getPassword(), vo.getRepassword());

        //2. 参数校验
        checkUserRegistRequestVo(vo);

        //3. 调用service层的方法进行业务逻辑处理
        userService.regist(vo);
        //4. 返回json给前端

        return new ResultVo(200,"ok","注册成功");
    }






    private void checkUserRegistRequestVo(UserRegistRequestVo vo) {
        String username = vo.getUsername();
        if (StringUtils.isEmpty(username)) {
            throw new RuntimeException("用户名不能为空");
        }

        String password = vo.getPassword();
        if (StringUtils.isEmpty(password)) {
            throw new RuntimeException("密码不能为空");
        }

        String repassword = vo.getRepassword();
//        if (StringUtils.isEmpty(repassword)) {
//            throw new RuntimeException("确认密码不能为空");
//        }

        if (!password.equals(repassword)){
            throw new RuntimeException("两次密码不一致，请检测");
        }

    }

}
